home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 April / PCWorld_2008-04_cd.bin / v cisle / personasfirefox / personas-latest.xpi / components / nsPersonaService.js < prev    next >
Text File  |  2007-12-11  |  8KB  |  229 lines

  1. /* ***** BEGIN LICENSE BLOCK *****
  2.  * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  3.  *
  4.  * The contents of this file are subject to the Mozilla Public License Version
  5.  * 1.1 (the "License"); you may not use this file except in compliance with
  6.  * the License. You may obtain a copy of the License at
  7.  * http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS" basis,
  10.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11.  * for the specific language governing rights and limitations under the
  12.  * License.
  13.  *
  14.  * The Original Code is Personas.
  15.  *
  16.  * The Initial Developer of the Original Code is Mozilla.
  17.  * Portions created by the Initial Developer are Copyright (C) 2007
  18.  * the Initial Developer. All Rights Reserved.
  19.  *
  20.  * Contributor(s):
  21.  *   Chris Beard <cbeard@mozilla.org>
  22.  *   Myk Melez <myk@mozilla.org>
  23.  *
  24.  * Alternatively, the contents of this file may be used under the terms of
  25.  * either the GNU General Public License Version 2 or later (the "GPL"), or
  26.  * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  27.  * in which case the provisions of the GPL or the LGPL are applicable instead
  28.  * of those above. If you wish to allow use of your version of this file only
  29.  * under the terms of either the GPL or the LGPL, and not to allow others to
  30.  * use your version of this file under the terms of the MPL, indicate your
  31.  * decision by deleting the provisions above and replace them with the notice
  32.  * and other provisions required by the GPL or the LGPL. If you do not delete
  33.  * the provisions above, a recipient may use your version of this file under
  34.  * the terms of any one of the MPL, the GPL or the LGPL.
  35.  *
  36.  * ***** END LICENSE BLOCK ***** */
  37.  
  38. const Cc = Components.classes;
  39. const Ci = Components.interfaces;
  40. const Cr = Components.results;
  41. const Cu = Components.utils;
  42.  
  43.  
  44. // Load the JavaScript code that will generate the XPCOM plumbing and eval
  45. // the JSON data we download.  If we're in Firefox 3, we import the code as
  46. // JavaScript modules; in Firefox 2 we use the subscript loader to load it
  47. // as subscripts.
  48. if ("import" in Cu) {
  49.   Cu.import("resource://gre/modules/XPCOMUtils.jsm");
  50.   Cu.import("resource://gre/modules/JSON.jsm");
  51. }
  52. else {
  53.   var subscriptLoader = Cc["@mozilla.org/moz/jssubscript-loader;1"].
  54.                         getService(Ci.mozIJSSubScriptLoader);
  55.   subscriptLoader.loadSubScript("chrome://personas/content/XPCOMUtils.jsm");
  56.   subscriptLoader.loadSubScript("chrome://personas/content/JSON.jsm");
  57. }
  58.  
  59.  
  60. const PERSONAS_UPDATE_INTERVAL = (30 * 60 * 1000); // 30 minutes
  61.  
  62.  
  63. function PersonaService() {
  64.   this._init();
  65. }
  66.  
  67. PersonaService.prototype = {
  68.   //**************************************************************************//
  69.   // XPCOM Plumbing
  70.  
  71.   classDescription: "Persona Service",
  72.   classID:          Components.ID("{efdd655c-51ac-4e5c-aa61-888b270436b8}"),
  73.   contractID:       "@mozilla.org/personas/persona-service;1",
  74.   QueryInterface:   XPCOMUtils.generateQI([Ci.nsIPersonaService]),
  75.  
  76.  
  77.   // Observer Service
  78.   get _obsSvc() {
  79.     var obsSvc = Cc["@mozilla.org/observer-service;1"].
  80.                  getService(Ci.nsIObserverService);
  81.     this.__defineGetter__("_obsSvc", function() { return obsSvc });
  82.     return this._obsSvc;
  83.   },
  84.  
  85.   // Preference Service
  86.   get _prefSvc() {
  87.     var prefSvc = Cc["@mozilla.org/preferences-service;1"].
  88.                   getService(Ci.nsIPrefBranch);
  89.     this.__defineGetter__("_prefSvc", function() { return prefSvc });
  90.     return this._prefSvc;
  91.   },
  92.  
  93.   /**
  94.    * Get the value of a pref, if any; otherwise, get the default value.
  95.    *
  96.    * @param   prefName
  97.    * @param   defaultValue
  98.    * @returns the value of the pref, if any; otherwise, the default value
  99.    */
  100.   _getPref: function(prefName, defaultValue) {
  101.     var prefSvc = this._prefSvc;
  102.  
  103.     try {
  104.       switch (prefSvc.getPrefType(prefName)) {
  105.         case Ci.nsIPrefBranch.PREF_STRING:
  106.           return prefSvc.getCharPref(prefName);
  107.         case Ci.nsIPrefBranch.PREF_INT:
  108.           return prefSvc.getIntPref(prefName);
  109.         case Ci.nsIPrefBranch.PREF_BOOL:
  110.           return prefSvc.getBoolPref(prefName);
  111.       }
  112.     }
  113.     catch (ex) {}
  114.  
  115.     return defaultValue;
  116.   },
  117.  
  118.   _init: function() {
  119.     this._obsSvc.addObserver(this, "xpcom-shutdown", false);
  120.  
  121.     // Update the category/persona lists immediately.
  122.     this.updateData();
  123.  
  124.     // Create a timer that updates the category/persona lists periodically.
  125.     this._timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
  126.     var callback = {
  127.       _personaSvc: this,
  128.       notify: function() { this._personaSvc.updateData() }
  129.     };
  130.     this._timer.initWithCallback(callback,
  131.                                  PERSONAS_UPDATE_INTERVAL,
  132.                                  Ci.nsITimer.TYPE_REPEATING_SLACK);
  133.   },
  134.  
  135.   _destroy: function() {
  136.     this._obsSvc.removeObserver(this, "xpcom-shutdown");
  137.     this._timer.cancel();
  138.     this._timer = null;
  139.   },
  140.  
  141.   // nsIObserver
  142.   observe: function(subject, topic, data) {
  143.     switch (topic) {
  144.       case "xpcom-shutdown":
  145.         this._destroy();
  146.         break;
  147.     }
  148.   },
  149.  
  150.   getLocale: function() {
  151.     switch(this._getPref("general.useragent.locale", "en-US")) {
  152.       case 'ja':
  153.       case 'ja-JP-mac':
  154.         return "ja";
  155.       default:
  156.         return "en-US";
  157.     }
  158.   },
  159.  
  160.   updateData: function() {
  161.     var baseURL = this._getPref("extensions.personas.url");
  162.     var locale = this.getLocale();
  163.  
  164.     var t = this;
  165.     this._makeRequest(baseURL + locale + "/personas_categories.dat",
  166.                       function(evt) { t.onCategoriesLoad(evt) });
  167.     this._makeRequest(baseURL + locale + "/personas_all.dat",
  168.                       function(evt) { t.onPersonasLoad(evt) });
  169.   },
  170.  
  171.   _makeRequest: function(aURL, aLoadCallback) {
  172.     var request = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance();
  173.  
  174.     request = request.QueryInterface(Ci.nsIDOMEventTarget);
  175.     request.addEventListener("load", aLoadCallback, false);
  176.  
  177.     request = request.QueryInterface(Ci.nsIXMLHttpRequest);
  178.     request.open("GET", aURL, true);
  179.     request.send(null);
  180.   },
  181.  
  182.   onCategoriesLoad: function(aEvent) {
  183.     var request = aEvent.target;
  184.  
  185.     // XXX Try to reload again sooner?
  186.     if (request.status != 200)
  187.       throw("problem loading categories: " + request.status + " - " + request.statusText);
  188.  
  189.     var categories = JSON.fromString(request.responseText).categories;
  190.     this.categories = { wrappedJSObject: categories };
  191.  
  192.     this._prefSvc.setCharPref("extensions.personas.lastcategoryupdate",
  193.                               new Date().getTime());
  194.   },
  195.  
  196.   onPersonasLoad: function(aEvent) {
  197.     var request = aEvent.target;
  198.  
  199.     // XXX Try to reload again sooner?
  200.     if (request.status != 200)
  201.       throw("problem loading personas: " + request.status + " - " + request.statusText);
  202.  
  203.     var personas = JSON.fromString(request.responseText).personas;
  204.     this.personas = { wrappedJSObject: personas };
  205.  
  206.     this._prefSvc.setCharPref("extensions.personas.lastlistupdate",
  207.                               new Date().getTime());
  208.   }
  209. }
  210.  
  211. //****************************************************************************//
  212. // More XPCOM Plumbing
  213.  
  214. function NSGetModule(compMgr, fileSpec) {
  215.   return XPCOMUtils.generateModule([PersonaService]);
  216. }
  217.  
  218. /*
  219. var PersonaController = {
  220.     init: function() {
  221.         this._observerSvc.addObserver();
  222.         118     // Observe profile-before-change so we can switch to the datasource
  223. 119     // in the new profile when the user changes profiles.
  224. 120     this._observerSvc.addObserver(this, "profile-before-change", false);
  225.  
  226.     }
  227. }
  228. */
  229.